//
//  ModuleModel.m
//  Game2048
//
//  Created by mis on 16/3/29.
//  Copyright © 2016年 mis. All rights reserved.
//

#import "ModuleModel.h"

@implementation ModuleModel
- (void*)loadModuleData {
//    srand(time(0));
    [self moduleCreate];
    return moduleData;
}

- (void)moduleCreate {
    // 统计空位置的数量
    int nul_count = 0;
    for (UInt8 row = 0; row < 4; row++) {
        for (UInt8 col = 0; col < 4; col++) {
            nul_count += !moduleData[row][col];
        }
    }
    // 只有用空白位置 无论如何也创建出来 用个死循环
    while (nul_count) {
//        UInt8 row = rand() % 4;
//        UInt8 col = rand() % 4;
        UInt8 row = arc4random() % 4;
        UInt8 col = arc4random() % 4;
        
        if (!moduleData[row][col]) {
            moduleData[row][col] = 2;
            [self.delegate moduleZoomRow:row Col:col];
            return;
        }
    }
}

- (void)moduleUp {
    // 假设本次不能发生移动或合并
    IS_MOVE_MGER = NO;
    for (UInt8 col = 0; col < 4; col++) {
        UInt8 move_code_count = 0;
    move_code:
        move_code_count++;
        for (UInt8 row = 1; row < 4; row++) {
            if (!moduleData[row][col]) {
                continue;
            }
            // 用来记录最终要移动的位置
            UInt8 move_end = UINT8_MAX;
        
            // 一旦寻找到非空位置 就是最终要移动到的位置
            for (UInt8 index = row - 1; index < UINT8_MAX; index--) { // UInt8不可能为0 当为0的时候 -1 那就是最大值 所以这里使用index < UINT8_MAX
                if(moduleData[index][col] == 0) {
                    move_end = index;
                }else {
                    break;
                }
            }
            if (UINT8_MAX == move_end) {
                continue;
            }
            
            [self.delegate moduleMoveDestRow:move_end DestCol:col SrcRow:row SrcCol:col];
            moduleData[move_end][col] = moduleData[row][col];
            moduleData[row][col] = 0;
            IS_MOVE_MGER = YES;
        }
        
        if (move_code_count == 2) {
            continue;
        }
        for (UInt8 row = 0; row < 3; row++) {
            if (moduleData[row][col] == moduleData[row+1][col] && moduleData[row][col]) {
                [self.delegate moduleMoveDestRow:row DestCol:col SrcRow:(row + 1) SrcCol:col];
                moduleData[row][col] *= 2;
                moduleData[row+1][col] = 0;
                IS_MOVE_MGER = YES;
            }
        }
        
        goto move_code;
    }
    
    if (IS_MOVE_MGER) {
        [self moduleCreate];
    }
}
@end
